import subprocess
import time
import random
import datetime
# import paddleocr
# import numpy as np
# import cv2
# print(np.__version__)


class ADBController:
    def __init__(self, adb_path=r".\\adbTools\\new\\adb.exe"):
        self.adb_path = adb_path

    def _execute(self, cmd):
        """执行ADB命令并返回输出"""
        full_cmd = f'"{self.adb_path}" {cmd}'  # 处理路径空格
        result = subprocess.run(
            full_cmd, 
            shell=True, 
            capture_output=True, 
            text=True
        )
        return result.stdout.strip()

    def tap(self, x, y, humanize=True):
        """模拟点击"""
        if humanize:  # 人性化随机偏移
            x += random.randint(-2, 2)
            y += random.randint(-2, 2)
            time.sleep(random.uniform(0.1, 0.3))
        return self._execute(f'shell input tap {x} {y}')

    def swipe(self, x1, y1, x2, y2, duration=400):
        """模拟滑动（duration单位：ms）"""
        return self._execute(
            f'shell input swipe {x1} {y1} {x2} {y2} {duration}'
        )
    def send_key(self, keycode):
        """发送按键事件"""
        subprocess.run(
            [self.adb_path, "shell", "input", "keyevent", str(keycode)],
            check=True
        )
    def back(self, times=1):
        """连续返回操作"""
        for _ in range(times):
            self.send_key(4)
            time.sleep(2)  # 模拟人类操作间隔
    


    def force_stop_game(self,GAME=1):
        GAME1 = "com.papegames.lysk.cn.nearme.gamecenter"
        GAME2 = "com.papegames.lysk.cn"
        if GAME==1:
            GAME_PACKAGE=GAME1
        if GAME==2:
            GAME_PACKAGE=GAME2

        """专用游戏关闭方法（带保险机制）"""
        try:
            # 第一次强制停止
            self._execute(f"shell am force-stop {self.GAME_PACKAGE}")
            time.sleep(1)
            
            # 二次确认关闭
            if self._is_game_running():
                self._execute(f"shell am kill {self.GAME_PACKAGE}")
                
            # 确保返回主页
            self.go_home()
            
        except Exception as e:
            print(f"强制关闭失败: {str(e)}")
            self._emergency_stop()
    
    def _is_game_running(self):
        """检查游戏进程是否仍在运行"""
        output = self._execute(f"shell pidof {self.GAME_PACKAGE}")
        return output.strip() != ""

    def _emergency_stop(self):
        """应急处理方案"""
        # 组合键强制停止（返回桌面+清理内存）
        self.go_home()
        self._execute("shell input keyevent 187")  # 打开最近任务
        time.sleep(0.5)
        self._execute("shell input swipe 500 2000 500 500 1000")  # 上滑清除

    def go_home(self, retry=3):
        # 先尝试标准主页键
            self._execute("shell input keyevent 3")
            time.sleep(0.3)


#从主界面进入恋与深空1
def startDP(adb,GameName):
    if GameName==1:
        x=235
        y=920
    if GameName==2:
        x=519
        y=898
    for i in range(4):
        adb.swipe(900, 1200, 100, 1200)  # 左滑动4次
    time.sleep(1)
    adb.tap(658, 285)  # 点击文件夹
    time.sleep(1)
    adb.tap(x, y)  # 点击游戏
    time.sleep(40)
    adb.tap(530, 1942)  # 点击 进入游戏
    time.sleep(30)


#快速完成所有男主的喵喵牌：
def allMiao(adb):
    adb.tap(194, 2248)  #进入 约会
    time.sleep(1)
    adb.tap(300, 879)  #进入 快乐出游
    time.sleep(2)
    for i in range(5):
        oneMiao(adb,i)
    adb.back(times=2)   #回到 游戏主界面

def oneMiao(adb,temp):
    #当前页应为5男主页面
    #5男主喵喵牌进入坐标：沈星回，黎深，祁煜，秦彻，夏以昼
    boysXY=[(343, 500),(687, 912),(345, 1312),(734, 1645),(325, 2004)]
    tempx=boysXY[temp][0]
    tempy=boysXY[temp][1]
    adb.tap(tempx,tempy)    #点击对应男主
    time.sleep(5)           #稍微等待
    adb.tap(280,1482)       #点击 喵喵牌（做一次）
    time.sleep(5)           #稍微等待
    gocat(adb)
    time.sleep(5)#等待弹出
    adb.back(times=2)  #返回两次到达约会
    time.sleep(2)#等待弹出
    adb.tap(300, 879)  #进入 快乐出游
    time.sleep(2)#等待弹出
    
def gocat(adb):
    for i in range(3):
        adb.tap(838,2020)   #点击 出发   （做3轮）
        time.sleep(13+random.randint(-2, 2)) #等待缓冲
        adb.back()              #退出喵喵牌
        time.sleep(5)#等待弹出
        adb.tap(767,1245)       #确认退出
        time.sleep(5)#等待弹出
        adb.tap(507,2042)       #点击空白
        time.sleep(13+random.randint(-2, 2)) #等待缓冲回到出发页


def wait(type):
    if type==1:
        time.sleep(3)   #短等待
    if type==2:
        time.sleep(13)   #中等等待
    if type==3:
        time.sleep(30)   #长等待

def alltoys(adb):
    adb.tap(194, 2248)  #进入 约会
    time.sleep(1)
    adb.tap(300, 879)  #进入 快乐出游
    time.sleep(3)
    #当前在五男主界面
    for i in [3,4]:
    # for i in range(5):
        onetoy(adb,i)
    adb.back(times=2)   #回到 游戏主界面

def onetoy(adb,temp):
    #当前页应为5男主页面
    #5男主喵喵牌进入坐标：沈星回，黎深，祁煜，秦彻，夏以昼
    boysXY=[(343, 500),(687, 912),(345, 1312),(734, 1645),(325, 2004)]
    tempx=boysXY[temp][0]
    tempy=boysXY[temp][1]
    adb.tap(tempx,tempy)    #点击对应男主
    time.sleep(5)           #稍微等待
    adb.tap(764,824)        #点击娃娃机
    time.sleep(5)           #稍微等待
    gotoy(adb,temp)
    time.sleep(5)#等待弹出
    adb.back(times=2)  #返回两次到达约会
    time.sleep(5)#等待弹出
    adb.tap(300, 879)  #进入 快乐出游
    time.sleep(5)#等待弹出

def gotoy(adb,temp):
    for i in range(2):
        adb.tap(287,1717)   #点击标准版
        adb.tap(577,2100)       #点击出发   （做2轮）
        time.sleep(13+random.randint(-2, 2)) #等待缓冲
        adb.tap(663,2282)   # 点击 自动
        adb.tap(801,2271)   # 点击3次倍速1.2，1.5，2
        adb.tap(801,2271)   # 点击3次倍速1.2，1.5，2
        adb.tap(801,2271)   # 点击3次倍速1.2，1.5，2

        # for k in range(10):
        #     adb.tap(527+random.randint(-300, 300),800+random.randint(-600, 600))   # 如果没有自动成功，连点几下
        #     time.sleep(1)

        time.sleep(10)
        adb.tap(527,1231)   # 点击 第一个选项，男主或我
        time.sleep(10)      # 等男主询问要啥娃娃
        # 开始抓娃娃
        for j in range(3):
            adb.tap(510,1300)   # 按四选项，末尾选项
            adb.tap(523,1234)   # 按三选项，末尾选项
            adb.tap(510,1100+random.randint(-300, 300))   # 随便按一个
            #如果是主控,模拟画圈
            adb.swipe( 284, 2104, 300+random.randint(-10, 10), 2068+random.randint(-10, 10), duration=random.randint(500,800)) #上移操作
            adb.swipe( 292, 2099, 422+random.randint(-10, 10), 2127+random.randint(-10, 10), duration=random.randint(500,1000)) #右移操作，时间到会默认下爪
            time.sleep(2)       # 等
            adb.tap(798,2230)   # 按下爪，如有
            time.sleep(35)      # 等娃娃    
        # if temp==2: #防止祁煜玩7次无法退出
        adb.back()              #退出娃娃机
        time.sleep(5)#等待弹出
        adb.tap(767,1245)       #确认退出
        time.sleep(5)#等待弹出
        time.sleep(15+random.randint(-2, 2)) #等待缓冲回到娃娃机出发页
        # else:
        # time.sleep(25)      # 等结算对话 
        # adb.tap(102,2132)       #点击空白,防止有新娃娃
        # wait(1)
        # adb.tap(102,2132)       #点击空白,防止有新娃娃
        # wait(1)
        # adb.tap(535,2013)       #点击空白，退出
        # time.sleep(15+random.randint(-2, 2)) #等待缓冲回到娃娃机出发页

        

def weekPlan(adb):
    adb.tap(130,584)    #点击 聊天符
    adb.tap(130,584)    #点击 聊天符
    wait(1)
    adb.tap(972,2243)   #点击 陪我一起
    adb.tap(972,2243)   #点击 陪我一起
    wait(1)
    for i in range(10):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符

    adb.tap(545,1571)   #点击 陪我运动
    wait(1)
    for i in range(10):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符

    adb.tap(179,1118)   #点击 5分钟
    wait(1)
    adb.tap(754,1305)   #点击 确定
    wait(1)
    for i in range(10):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符
    time.sleep(330)     #等待运动结束
    adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符
    adb.tap(535,2213)       #点击奖励下方空白，退出
    wait(1)
    adb.tap(535,2213)       #点击奖励下方空白，退出
    wait(2)

    adb.tap(972,2243)   #点击 陪我一起
    wait(1)
    for i in range(10):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符
    adb.tap(862,1758)   #点击 陪我学习
    wait(1)
    for i in range(10):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符
    adb.tap(179,1118)   #点击 5分钟
    wait(1)
    adb.tap(754,1305)   #点击 确定
    time.sleep(330)     #等待学习结束
    adb.tap(337,1314)   #点击 取消继续学习
    wait(1)
    for i in range(5):
        adb.tap(304+random.randint(-2, 2),895+random.randint(-2, 2))   #点击对话符
    adb.tap(535,2213)       #点击魔方，退出
    wait(1)
    adb.tap(535,2213)       #点击空白，退出
    wait(1)
    adb.tap(303,895)       #点击空白，退出
    # adb.back()       # 返回游戏主界面
    wait(1)

def weekProcess(adb,temp):
    # startDP(adb,temp)  #打开恋与深空1
    # weekPlan(adb)    #每周运动和学习   
    # allMiao(adb)  #开始做喵喵牌
    alltoys(adb)  #开始抓娃娃    
    # adb.force_stop_game(temp)   #关闭恋与深空应用
    adb.go_home()           #返回主页



    # startDP(2)  #打开恋与深空2
    # allMiao(2)  #开始做喵喵牌
    # alltoys(2)  #开始抓娃娃

if __name__ == "__main__":
    adb = ADBController()

    # adb.go_home()   #来到主页
    # 获取当前日期
    # current_date = datetime.datetime.now()
    # if current_date.isoweekday() == 1:
        # print("ISO标准判断今天是周一")
        #周喵牌日常
    # weekProcess(adb,1)
    # weekProcess(adb,2)

    startDP(adb,1)  #打开恋与深空1
    weekPlan(adb)    #每周运动和学习   
    allMiao(adb)  #开始做喵喵牌
    alltoys(adb)  #开始抓娃娃    
    adb.go_home()    #返回主页

    startDP(adb,2)  #打开恋与深空2
    weekPlan(adb)    #每周运动和学习   
    allMiao(adb)  #开始做喵喵牌
    alltoys(adb)  #开始抓娃娃    
    adb.go_home()   #返回主页



#截图 查看有无选项
    #有则，选项1
    #没有则继续
#截图，查看是男主还是我在玩
# 男主玩则等待
# 截图查看是否需要选择娃娃类型
    #进行选择
# 截图查看男主是否需要换人
    #选择选项1
# 我玩